import axios from 'axios'
import store from '../store'
import router from '../router'
import storage from '../utils/storage'
import jsonBig from 'json-bigint'
import { Notify } from 'vant'

function redirectLogin() {
  console.log(router.currentRoute.fullPath)
  router.push({
    name:'login',
    query:{
      redirect:router.currentRoute.fullPath
    }
  })
}

function request(config) {
  const instance = axios.create({
    baseURL: 'http://ttapi.research.itcast.cn/app',
    timeout: 9000,
    method: "GET",
    // transformResponse 允许自定义原始的响应数据（字符串）
    transformResponse: [function (data) {
      try {
        // 如果转换成功则返回转换的数据结果
        return jsonBig.parse(data)
      } catch (err) {
        // 如果转换失败，则包装为统一数据格式并返回
        return {
          data
        }
      }
    }]
  })

  // 请求拦截
  // Add a request interceptor
  instance.interceptors.request.use(function (config) {
    // Do something before request is sent
    const { USER_TOKEN } = store.state

    // 如果用户已登录，统一给接口设置 token 信息
    if (USER_TOKEN) {
      config.headers.Authorization = `Bearer ${USER_TOKEN.token}`
    }

    // 处理完之后一定要把 config 返回，否则请求就会停在这里
    return config
  }, function (error) {
    // Do something with request error
    return Promise.reject(error)
  })
  //响应拦截
  instance.interceptors.response.use(
    response => response.data,
    // 响应失败进入第2个函数，该函数的参数是错误对象
    async function (error) {
      // Do something with response error
      // 如果响应码是 401 ，则请求获取新的 token
      // 响应拦截器中的 error 就是那个响应的错误对象
      console.dir(error);
      if (error.response && error.response.status === 401) {
        // 校验是否有 refresh_token
        const USER_TOKEN = store.state.USER_TOKEN;

        if (!USER_TOKEN || !USER_TOKEN.refresh_token) {
          redirectLogin()
          // 代码不要往后执行了
          return;
        }
        // 如果有refresh_token，则请求获取新的 token
        try {
          const res = await axios({
            method: "PUT",
            url: "http://ttapi.research.itcast.cn/app/v1_0/authorizations",
            headers: {
              Authorization: `Bearer ${USER_TOKEN.refresh_token}`
            }
          });

          // 如果获取成功，则把新的 token 更新到容器和本地中
          console.log("刷新 token  成功", res);
          storage.setItem("USER_TOKEN", {
            token: res.data.data.token, // 最新获取的可用 token
            refresh_token: USER_TOKEN.refresh_token // 还是原来的 refresh_token
          })
          store.commit("setUserToken", {
            token: res.data.data.token, // 最新获取的可用 token
            refresh_token: USER_TOKEN.refresh_token // 还是原来的 refresh_token
          });

          // 把之前失败的用户请求继续发出去
          // config 是一个对象，其中包含本次失败请求相关的那些配置信息，例如 url、method 都有
          // return 把 request 的请求结果继续返回给发请求的具体位置
          return request(error.config);
        } catch (err) {
          // 如果获取失败，直接跳转 登录页
          console.log("请求刷线 token 失败", err);
          redirectLogin()
        }
      }else{
        Notify({ type: 'danger', message: '服务端异常' })
      }

      return Promise.reject(error);
    }
  )
  return instance(config)

  // return new Promise(resolve => {
  //   instance(config)
  //     .then(value => resolve(value))
  //     .catch(reason => resolve(reason))
  // })
}

export default request


// /**
//  * 封装 axios 请求模块
//  */
// import axios from 'axios'
// import jsonBig from 'json-bigint'
// import store from '@/store'
// import router from '@/router'
// // import { Notify } from 'vant'

// // axios.create 方法：复制一个 axios
// const request = axios.create({
//   baseURL: 'http://ttapi.research.itcast.cn/app'
//   // baseURL: process.env.NODE_ENV === 'production'
//   //   ? 'http://api-toutiao-web.itheima.net'
//   //   : 'http://ttapi.research.itcast.cn/'
// })

// /**
//  * 配置处理后端返回数据中超出 js 安全整数范围问题
//  */
// request.defaults.transformResponse = [function (data) {
//   try {
//     return jsonBig.parse(data)
//   } catch (err) {
//     return {}
//   }
// }]

// // 请求拦截器
// request.interceptors.request.use(
//   function (config) {
//     const USER_TOKEN = store.state.USER_TOKEN
//     if (USER_TOKEN) {
//       config.headers.Authorization = `Bearer ${USER_TOKEN.token}`
//     }
//     // Do something before request is sent
//     return config
//   },
//   function (error) {
//     // Do something with request error
//     return Promise.reject(error)
//   }
// )

// // 响应拦截器
// request.interceptors.response.use(
//   response => {
//     return response.data
//   },
//   async error => {
//     if (error.response && error.response.status === 401) {
//       // 校验是否有 refresh_token
//       const USER_TOKEN = store.state.USER_TOKEN

//       if (!USER_TOKEN || !USER_TOKEN.refresh_token) {
//         // router.push('/login')
//         redirectLogin()

//         // 代码不要往后执行了
//         return
//       }

//       // 如果有refresh_token，则请求获取新的 token
//       try {
//         const res = await axios({
//           method: 'PUT',
//           url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
//           headers: {
//             Authorization: `Bearer ${USER_TOKEN.refresh_token}`
//           }
//         })

//         // 如果获取成功，则把新的 token 更新到容器中
//         store.commit('setUserToken', {
//           ...USER_TOKEN,
//           token: res.data.data.token // 最新获取的可用 token
//         })

//         // 把之前失败的用户请求继续发出去
//         // config 是一个对象，其中包含本次失败请求相关的那些配置信息，例如 url、method 都有
//         // return 把 request 的请求结果继续返回给发请求的具体位置
//         return request(error.config)
//       } catch (err) {
//         // 如果获取失败，直接跳转 登录页
//         console.log('请求刷线 token 失败', err)
//         // router.push('/login')
//         redirectLogin()
//       }
//     } else if (error.response.status === 500) {
//       // Notify('服务端异常，请稍后重试')
//     }
//     return Promise.reject(error)
//   }
// )

// function redirectLogin () {
//   router.push({
//     name: 'login',
//     query: {
//       redirect: router.currentRoute.fullPath
//     }
//   })
// }

// export default request